#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100
typedef struct {
    int items[MAX_SIZE];  // 用于存储队列元素的数组
    int front;           // 队列的前端索引
    int rear;            // 队列的后端索引
} Queue;
void initializeQueue(Queue *q) {//用于初始化队列
    q->front = -1;  // 初始化前端索引为-1，表示队列为空
    q->rear = -1;   // 初始化后端索引为-1，表示队列为空
}
int isEmpty(Queue *q) {//检查队列是否为空
    return q->front == -1;  // 如果 front 为 -1，队列为空
}
int isFull(Queue *q) {//检查队列是否已满
    return q->rear == MAX_SIZE - 1;  // 如果 rear 等于最大容量减1，队列已满
}
void enqueue(Queue *q, int value) {//入队操作
    if (isFull(q)) {  // 如果队列已满，输出错误信息
        printf("Queue is full!\n");
    } else {
        if (isEmpty(q)) {  // 如果队列为空，将 front 设置为 0
            q->front = 0;
        }
        q->rear++;              // 将 rear 向后移动一位
        q->items[q->rear] = value;  // 在 rear 位置插入新元素
    }
}
int dequeue(Queue *q) {//出队操作
    int item;
    if (isEmpty(q)) {  // 如果队列为空，输出错误信息并返回 -1
        printf("Queue is empty!\n");
        return -1;
    } else {
        item = q->items[q->front];  // 获取 front 位置的元素
        q->front++;                // 将 front 向后移动一位
        if (q->front > q->rear) {  // 如果 front 超过 rear，重置队列为空
            q->front = q->rear = -1;
        }
        return item;  // 返回出队的元素
    }
}
int front(Queue *q) {//查看队首元素
    if (isEmpty(q)) {  // 如果队列为空，输出错误信息并返回 -1
        printf("Queue is empty!\n");
        return -1;
    } else {
        return q->items[q->front];  // 返回 front 位置的元素
    }
}
// 测试用例
int main() {
    Queue q;  // 定义一个队列变量
    initializeQueue(&q);  // 初始化队列

    enqueue(&q, 10);  // 入队元素 10
    enqueue(&q, 20);  // 入队元素 20
    enqueue(&q, 30);  // 入队元素 30

    printf("队列的前端元素是 %d\n", front(&q));  // 查看队首元素

   printf("从队列中出队 %d \n", dequeue(&q)); // 出队元素
    printf("从队列中出队了 %d\n", dequeue(&q));  // 出队元素

    printf("队列的前端元素是 %d\n", front(&q));  // 查看队首元素

    return 0;
}